<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js coal">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>rust grammar - Andrew&#x27;s Blog</title>


        <!-- Custom HTML head -->
        
        <meta name="description" content="Andrew Ryan&#x27;s Blog">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        <link rel="icon" href="../../favicon.svg">
        <link rel="shortcut icon" href="../../favicon.png">
        <link rel="stylesheet" href="../../css/variables.css">
        <link rel="stylesheet" href="../../css/general.css">
        <link rel="stylesheet" href="../../css/chrome.css">

        <!-- Fonts -->
        <link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
        <link rel="stylesheet" href="../../fonts/fonts.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="../../highlight.css">
        <link rel="stylesheet" href="../../tomorrow-night.css">
        <link rel="stylesheet" href="../../ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        <link rel="stylesheet" href="../../src/style/custom.css">

        <!-- MathJax -->
        <script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
    </head>
    <body>
    <div id="body-container">
        <!-- Provide site root to javascript -->
        <script>
            var path_to_root = "../../";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "coal" : "coal";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script>
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script>
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('coal')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script>
            var html = document.querySelector('html');
            var sidebar = null;
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            } else {
                sidebar = 'hidden';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item affix "><a href="../../index.html">Andrew's Blog</a></li><li class="chapter-item "><a href="../../posts/linux/linux.html"><strong aria-hidden="true">1.</strong> Linux</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/linux/install_linux.html"><strong aria-hidden="true">1.1.</strong> install linux</a></li><li class="chapter-item "><a href="../../posts/linux/bash_profile.html"><strong aria-hidden="true">1.2.</strong> bash profile</a></li><li class="chapter-item "><a href="../../posts/linux/command_list.html"><strong aria-hidden="true">1.3.</strong> command list</a></li><li class="chapter-item "><a href="../../posts/linux/git_guide.html"><strong aria-hidden="true">1.4.</strong> git guide</a></li><li class="chapter-item "><a href="../../posts/linux/tar.html"><strong aria-hidden="true">1.5.</strong> tar</a></li><li class="chapter-item "><a href="../../posts/Linux/git_cheatsheet.html"><strong aria-hidden="true">1.6.</strong> Git Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/Linux/bash_cheatsheet.html"><strong aria-hidden="true">1.7.</strong> Bash Cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/macos/mac.html"><strong aria-hidden="true">2.</strong> MacOS</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/macos/macos_profiles.html"><strong aria-hidden="true">2.1.</strong> macos profiles</a></li><li class="chapter-item "><a href="../../posts/macos/macos_pwn_env_setup.html"><strong aria-hidden="true">2.2.</strong> macos pwn env setup</a></li></ol></li><li class="chapter-item "><a href="../../posts/swift/swift.html"><strong aria-hidden="true">3.</strong> Swift</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/swift/learn_swift.html"><strong aria-hidden="true">3.1.</strong> learn swift basics</a></li><li class="chapter-item "><a href="../../posts/swift/swift_extensions.html"><strong aria-hidden="true">3.2.</strong> Swift extensions</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_extension.html"><strong aria-hidden="true">3.3.</strong> SwiftUI extensions</a></li><li class="chapter-item "><a href="../../posts/swift/install_swift.html"><strong aria-hidden="true">3.4.</strong> install swift</a></li><li class="chapter-item "><a href="../../posts/swift/task_planner.html"><strong aria-hidden="true">3.5.</strong> implment task panner app with SwiftUI</a></li><li class="chapter-item "><a href="../../posts/swift/swift_cheat_sheet.html"><strong aria-hidden="true">3.6.</strong> Swift Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/swift/yinci_url.html"><strong aria-hidden="true">3.7.</strong> Personal privacy protocol</a></li><li class="chapter-item "><a href="../../posts/swift/swift_regular_exressions.html"><strong aria-hidden="true">3.8.</strong> Swift regular exressions</a></li><li class="chapter-item "><a href="../../posts/ios/how_to_create_beautiful_ios_charts_in_swift.html"><strong aria-hidden="true">3.9.</strong> How to Create Beautiful iOS Charts in Swift</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_source_code.html"><strong aria-hidden="true">3.10.</strong> SwiftUI source code</a></li><li class="chapter-item "><a href="../../posts/swift/use_swift_fetch_iciba_api.html"><strong aria-hidden="true">3.11.</strong> use swift fetch iciba API</a></li></ol></li><li class="chapter-item "><a href="../../posts/ios/ios.html"><strong aria-hidden="true">4.</strong> iOS</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ios/cocaposd_setup_and_install_for_ios_project.html"><strong aria-hidden="true">4.1.</strong> cocaposd setup and install for ios project</a></li><li class="chapter-item "><a href="../../posts/ios/swiftui_show_gif_image.html"><strong aria-hidden="true">4.2.</strong> SwiftUI show gif image</a></li><li class="chapter-item "><a href="../../posts/ios/implement_task_planner_app.html"><strong aria-hidden="true">4.3.</strong> implement Task planner App</a></li></ol></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c.html"><strong aria-hidden="true">5.</strong> Objective-C</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/objective_c/objective_c_cheat_sheet.html"><strong aria-hidden="true">5.1.</strong> Objective-C Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c_for_absolute_beginners_read_note.html"><strong aria-hidden="true">5.2.</strong> Objective-C Note</a></li></ol></li><li class="chapter-item "><a href="../../posts/dart/dart.html"><strong aria-hidden="true">6.</strong> Dart</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/dart/flutter.html"><strong aria-hidden="true">6.1.</strong> Flutter Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/dart/dart_cheat_sheet.html"><strong aria-hidden="true">6.2.</strong> Dart Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/flutter/flutter_dev_test.html"><strong aria-hidden="true">6.3.</strong> Flutter dev test</a></li></ol></li><li class="chapter-item expanded "><a href="../../posts/rust/rust.html"><strong aria-hidden="true">7.</strong> Rust</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/rust/offline_use_rust.html"><strong aria-hidden="true">7.1.</strong> Offline use rust</a></li><li class="chapter-item expanded "><a href="../../posts/rust/rust_grammer.html" class="active"><strong aria-hidden="true">7.2.</strong> rust grammar</a></li><li class="chapter-item "><a href="../../posts/rust/pase_string_and_decimal_conversion.html"><strong aria-hidden="true">7.3.</strong> pase string and decimal conversion</a></li><li class="chapter-item "><a href="../../posts/rust/parse_types.html"><strong aria-hidden="true">7.4.</strong> rust types</a></li><li class="chapter-item "><a href="../../posts/rust/rust_life_cycle.html"><strong aria-hidden="true">7.5.</strong> Rust life cycle</a></li><li class="chapter-item "><a href="../../posts/rust/rust_generic.html"><strong aria-hidden="true">7.6.</strong> rust generics</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implment_matrix.html"><strong aria-hidden="true">7.7.</strong> Rust implement matrix</a></li><li class="chapter-item "><a href="../../posts/rust/rust_sort.html"><strong aria-hidden="true">7.8.</strong> Rust implement sort algorithms</a></li><li class="chapter-item "><a href="../../posts/rust/implement_aes_encryption.html"><strong aria-hidden="true">7.9.</strong> Rust implement AEC encryption and decryption</a></li><li class="chapter-item "><a href="../../posts/rust/implement_trie_data_structure.html"><strong aria-hidden="true">7.10.</strong> implement trie data structure</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_tree.html"><strong aria-hidden="true">7.11.</strong> implement tree data_structure</a></li><li class="chapter-item "><a href="../../posts/rust/list_dir.html"><strong aria-hidden="true">7.12.</strong> list dir</a></li><li class="chapter-item "><a href="../../posts/rust/fast_way_to_implment_object_trait.html"><strong aria-hidden="true">7.13.</strong> fast way to implment object trait</a></li><li class="chapter-item "><a href="../../posts/rust/compress_rust_binary_size.html"><strong aria-hidden="true">7.14.</strong> compress rust binary size</a></li><li class="chapter-item "><a href="../../posts/rust/implment_file_upload_backend.html"><strong aria-hidden="true">7.15.</strong> impliment file upload</a></li><li class="chapter-item "><a href="../../posts/rust/this_is_add_post_cli_implementation_in_rust.html"><strong aria-hidden="true">7.16.</strong> this is add_post cli implementation in rust</a></li><li class="chapter-item "><a href="../../posts/rust/use_rust_implment_a_copyclipbord_cli.html"><strong aria-hidden="true">7.17.</strong> Use rust implment a copyclipbord CLI</a></li><li class="chapter-item "><a href="../../posts/rust/sqlite_database_add_delete_update_show_in_rust.html"><strong aria-hidden="true">7.18.</strong> sqlite database add delete update show in rust</a></li><li class="chapter-item "><a href="../../posts/rust/implementing_tokio_joinhandle_for_wasm.html"><strong aria-hidden="true">7.19.</strong> Implementing tokio JoinHandle for wasm</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_a_crate_for_encode_and_decode_brainfuck_and_ook.html"><strong aria-hidden="true">7.20.</strong> rust implement a crate for encode and decode brainfuck and ook</a></li><li class="chapter-item "><a href="../../posts/rust/slint_builtin_elements.html"><strong aria-hidden="true">7.21.</strong> Slint Builtin Elements</a></li><li class="chapter-item "><a href="../../posts/rust/corporate_network_install_rust_on_windows.html"><strong aria-hidden="true">7.22.</strong> Corporate network install Rust on windows</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_file_how_to_judge_static_link_or_dynamic_link_in_macos.html"><strong aria-hidden="true">7.23.</strong> rust binary file how to judge static link or dynamic link in Macos</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_include_dir_and_get_contents.html"><strong aria-hidden="true">7.24.</strong> rust binary include dir and get contents</a></li><li class="chapter-item "><a href="../../posts/rust/how_to_create_yolov8_based_object_detection_web_service_using_python,_julia,_node.js,_javascript,_go_and_rust.html"><strong aria-hidden="true">7.25.</strong> How to create YOLOv8-based object detection web service using Python, Julia, Node.js, JavaScript, Go and Rust</a></li><li class="chapter-item "><a href="../../posts/rust/implment_builder_proc_macro_for_command_struct.html"><strong aria-hidden="true">7.26.</strong> implment Builder proc-macro for Command struct</a></li></ol></li><li class="chapter-item "><a href="../../posts/java/java.html"><strong aria-hidden="true">8.</strong> Java</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/java/java_grammar.html"><strong aria-hidden="true">8.1.</strong> java grammar and codewar</a></li><li class="chapter-item "><a href="../../posts/java/run_jar.html"><strong aria-hidden="true">8.2.</strong> java run .jar</a></li><li class="chapter-item "><a href="../../posts/java/java_pomxml_add_defaultgoal_to_build.html"><strong aria-hidden="true">8.3.</strong> Java pomxml add defaultGoal to build</a></li><li class="chapter-item "><a href="../../posts/java/java_set_mvn_mirror.html"><strong aria-hidden="true">8.4.</strong> Java set mvn mirror</a></li></ol></li><li class="chapter-item "><a href="../../posts/python/python.html"><strong aria-hidden="true">9.</strong> Python</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/python/convert_pesn.html"><strong aria-hidden="true">9.1.</strong> convert pesn</a></li><li class="chapter-item "><a href="../../posts/python/find_remove_dir.html"><strong aria-hidden="true">9.2.</strong> find and remove dir</a></li><li class="chapter-item "><a href="../../posts/python/timing_message.html"><strong aria-hidden="true">9.3.</strong> wechat send message</a></li><li class="chapter-item "><a href="../../posts/python/use_python_openpyxl_package_read_and_edit_excel_files.html"><strong aria-hidden="true">9.4.</strong> Use python openpyxl package read and edit excel files</a></li><li class="chapter-item "><a href="../../posts/python/sanctum_model_yaml.html"><strong aria-hidden="true">9.5.</strong> sanctum model yaml</a></li><li class="chapter-item "><a href="../../posts/python/how_to_detect_objects_on_images_using_the_yolov8_neural_network.html"><strong aria-hidden="true">9.6.</strong> How to detect objects on images using the YOLOv8 neural network</a></li><li class="chapter-item "><a href="../../posts/python/use_huggingface_model.html"><strong aria-hidden="true">9.7.</strong> use huggingface model</a></li></ol></li><li class="chapter-item "><a href="../../posts/go/go.html"><strong aria-hidden="true">10.</strong> Go</a></li><li class="chapter-item "><a href="../../posts/javascript/js.html"><strong aria-hidden="true">11.</strong> Javascript</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/javascript/js_tutorial.html"><strong aria-hidden="true">11.1.</strong> js tutorial</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_map.html"><strong aria-hidden="true">11.2.</strong> ja map</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_math.html"><strong aria-hidden="true">11.3.</strong> js math</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_object.html"><strong aria-hidden="true">11.4.</strong> js object</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_set.html"><strong aria-hidden="true">11.5.</strong> js set</a></li><li class="chapter-item "><a href="../../posts/javascript/single_thread_and_asynchronous.html"><strong aria-hidden="true">11.6.</strong> single thread and asynchronous</a></li><li class="chapter-item "><a href="../../posts/javascript/this.html"><strong aria-hidden="true">11.7.</strong> js this</a></li><li class="chapter-item "><a href="../../posts/javascript/js_implment_aes.html"><strong aria-hidden="true">11.8.</strong> js implment aes</a></li><li class="chapter-item "><a href="../../posts/javascript/getting_started_with_ajax.html"><strong aria-hidden="true">11.9.</strong> getting started with ajax</a></li><li class="chapter-item "><a href="../../posts/javascript/BinarySearchTree.html"><strong aria-hidden="true">11.10.</strong> binary search tree</a></li><li class="chapter-item "><a href="../../posts/javascript/goole_zx.html"><strong aria-hidden="true">11.11.</strong> goole zx</a></li><li class="chapter-item "><a href="../../posts/javascript/es6.html"><strong aria-hidden="true">11.12.</strong> es6</a></li></ol></li><li class="chapter-item "><a href="../../posts/ruby/ruby.html"><strong aria-hidden="true">12.</strong> Ruby</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ruby/rails_setup_env.html"><strong aria-hidden="true">12.1.</strong> ruby on rails setup environment</a></li><li class="chapter-item "><a href="../../posts/ruby/learn_ruby.html"><strong aria-hidden="true">12.2.</strong> learn ruby</a></li><li class="chapter-item "><a href="../../posts/ruby/ruby_note.html"><strong aria-hidden="true">12.3.</strong> Ruby Note</a></li><li class="chapter-item "><a href="../../posts/ruby/setup_ruby_for_ctf.html"><strong aria-hidden="true">12.4.</strong> Setup ruby for CTF</a></li></ol></li><li class="chapter-item "><a href="../../posts/react/react.html"><strong aria-hidden="true">13.</strong> React</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/react/react_life_cycle.html"><strong aria-hidden="true">13.1.</strong> react life cycle</a></li><li class="chapter-item "><a href="../../posts/react/react_router.html"><strong aria-hidden="true">13.2.</strong> react router</a></li><li class="chapter-item "><a href="../../posts/react/react_this.html"><strong aria-hidden="true">13.3.</strong> react this</a></li><li class="chapter-item "><a href="../../posts/react/react_interviw.html"><strong aria-hidden="true">13.4.</strong> react interview</a></li><li class="chapter-item "><a href="../../posts/react/important_react_interview.html"><strong aria-hidden="true">13.5.</strong> important react interview</a></li><li class="chapter-item "><a href="../../posts/react/react_quick_reference.html"><strong aria-hidden="true">13.6.</strong> react quick reference</a></li><li class="chapter-item "><a href="../../posts/react/redux_quick_reference.html"><strong aria-hidden="true">13.7.</strong> redux quick reference</a></li></ol></li><li class="chapter-item "><a href="../../posts/vue/vue.html"><strong aria-hidden="true">14.</strong> Vue</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/vue/vue_ajax.html"><strong aria-hidden="true">14.1.</strong> vue ajax</a></li></ol></li><li class="chapter-item "><a href="../../posts/angular/angular.html"><strong aria-hidden="true">15.</strong> Angular</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/angular/controller_communication.html"><strong aria-hidden="true">15.1.</strong> controller communication</a></li><li class="chapter-item "><a href="../../posts/angular/creating_custom_directives.html"><strong aria-hidden="true">15.2.</strong> creating custom directives</a></li><li class="chapter-item "><a href="../../posts/angular/directive_notes.html"><strong aria-hidden="true">15.3.</strong> directive notes</a></li><li class="chapter-item "><a href="../../posts/angular/directive_communication.html"><strong aria-hidden="true">15.4.</strong> directive communication</a></li><li class="chapter-item "><a href="../../posts/angular/post_params.html"><strong aria-hidden="true">15.5.</strong> post params</a></li><li class="chapter-item "><a href="../../posts/angular/read_json_angular.html"><strong aria-hidden="true">15.6.</strong> read json angular</a></li><li class="chapter-item "><a href="../../posts/angular/same_route_reload.html"><strong aria-hidden="true">15.7.</strong> same route reload</a></li></ol></li><li class="chapter-item "><a href="../../posts/css/css.html"><strong aria-hidden="true">16.</strong> Css</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/css/use_css_media.html"><strong aria-hidden="true">16.1.</strong> use css media</a></li></ol></li><li class="chapter-item "><a href="../../posts/php/php.html"><strong aria-hidden="true">17.</strong> Php</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/php/for_php_string_implment_some_extemtion_functions.html"><strong aria-hidden="true">17.1.</strong> for php string implment some extemtion functions</a></li><li class="chapter-item "><a href="../../posts/php/php_cheatsheet.html"><strong aria-hidden="true">17.2.</strong> PHP cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/windows/windows.html"><strong aria-hidden="true">18.</strong> Windows</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/windows/windows.html"><strong aria-hidden="true">18.1.</strong> Windows</a></li><li class="chapter-item "><a href="../../posts/windows/windows10_use_powershell_dedup_redundent_path.html"><strong aria-hidden="true">18.2.</strong> Windows10 use PowerShell dedup redundent PATH</a></li></ol></li><li class="chapter-item "><a href="../../posts/leetcode/leetcode.html"><strong aria-hidden="true">19.</strong> Leetcode</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/leetcode/rust_leetcode.html"><strong aria-hidden="true">19.1.</strong> rust leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_codewar.html"><strong aria-hidden="true">19.2.</strong> rust codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/swift_codewar.html"><strong aria-hidden="true">19.3.</strong> swift codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/js_leetcode.html"><strong aria-hidden="true">19.4.</strong> js leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/java_leetcode.html"><strong aria-hidden="true">19.5.</strong> java leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_huawei.html"><strong aria-hidden="true">19.6.</strong> huawei test</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_utils.html"><strong aria-hidden="true">19.7.</strong> rust common functions</a></li><li class="chapter-item "><a href="../../posts/leetcode/olympiad_training.html"><strong aria-hidden="true">19.8.</strong> Computer olympiad training</a></li></ol></li><li class="chapter-item "><a href="../../posts/ctf/CTF.html"><strong aria-hidden="true">20.</strong> CTF</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ctf/CTF_Note.html"><strong aria-hidden="true">20.1.</strong> CTF Note</a></li><li class="chapter-item "><a href="../../posts/ctf/0.1_Web.html"><strong aria-hidden="true">20.2.</strong> Web</a></li><li class="chapter-item "><a href="../../posts/ctf/4.1_Misc.html"><strong aria-hidden="true">20.3.</strong> Misc</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">20.4.</strong> PWN</a></li><li class="chapter-item "><a href="../../posts/ctf/3.1_Crypto.html"><strong aria-hidden="true">20.5.</strong> Crypto</a></li><li class="chapter-item "><a href="../../posts/ctf/3.4_RSA_note.html"><strong aria-hidden="true">20.6.</strong> Rsa attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.5_Base64.html"><strong aria-hidden="true">20.7.</strong> Base64</a></li><li class="chapter-item "><a href="../../posts/ctf/0.0_SQL Injection Cheatsheet.html"><strong aria-hidden="true">20.8.</strong> SQL Injection Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/1.1_SQL_injection.html"><strong aria-hidden="true">20.9.</strong> SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.2_SQL_injection_UNION_attacks.html"><strong aria-hidden="true">20.10.</strong> SQL Injection UNION attacks</a></li><li class="chapter-item "><a href="../../posts/ctf/1.3_Blind SQL injection.html"><strong aria-hidden="true">20.11.</strong> Blind SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.4_Code Injection.html"><strong aria-hidden="true">20.12.</strong> Code Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.5_SSRF.html"><strong aria-hidden="true">20.13.</strong> SSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.6_OS command injection.html"><strong aria-hidden="true">20.14.</strong> OS command injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.7_Local file inclusion.html"><strong aria-hidden="true">20.15.</strong> Local file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.8_Remote file inclusion.html"><strong aria-hidden="true">20.16.</strong> Remote file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.9_CSRFm.html"><strong aria-hidden="true">20.17.</strong> CSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.10_NoSQL injection.html"><strong aria-hidden="true">20.18.</strong> NoSQL injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.11_JSON injection.html"><strong aria-hidden="true">20.19.</strong> JSON injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.12_CTF_Web_SQL_Note.html"><strong aria-hidden="true">20.20.</strong> CTF Web SQL Note</a></li><li class="chapter-item "><a href="../../posts/ctf/2.1_XXE.html"><strong aria-hidden="true">20.21.</strong> XXE</a></li><li class="chapter-item "><a href="../../posts/ctf/2.2_XSS.html"><strong aria-hidden="true">20.22.</strong> XSS</a></li><li class="chapter-item "><a href="../../posts/ctf/2.3_Upload File.html"><strong aria-hidden="true">20.23.</strong> Upload File</a></li><li class="chapter-item "><a href="../../posts/ctf/2.4_serialize_unserialize.html"><strong aria-hidden="true">20.24.</strong> serialize unserialize</a></li><li class="chapter-item "><a href="../../posts/ctf/2.5_Race condition.html"><strong aria-hidden="true">20.25.</strong> Race condition</a></li><li class="chapter-item "><a href="../../posts/ctf/zip_plain_text_attack.html"><strong aria-hidden="true">20.26.</strong> Zip plain text attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.3_pwn HCTF2016 brop.html"><strong aria-hidden="true">20.27.</strong> pwn HCTF2016 brop</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_patch_defense_skill.html"><strong aria-hidden="true">20.28.</strong> PWN Patch defense skill</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_stack_overflow.html"><strong aria-hidden="true">20.29.</strong> PWN stack overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_heap_overflow.html"><strong aria-hidden="true">20.30.</strong> PWN heap overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_format_string_vulnerability.html"><strong aria-hidden="true">20.31.</strong> PWN Format String Vulnerability</a></li><li class="chapter-item "><a href="../../posts/ctf/kali_linux_tutorials.html"><strong aria-hidden="true">20.32.</strong> Kali linux tutorials</a></li><li class="chapter-item "><a href="../../posts/ctf/google_dorks_2023_lists.html"><strong aria-hidden="true">20.33.</strong> Google Dorks 2023 Lists</a></li><li class="chapter-item "><a href="../../posts/ctf/dvwa_writeup.html"><strong aria-hidden="true">20.34.</strong> DVWA WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/bwapp_writeup.html"><strong aria-hidden="true">20.35.</strong> bWAPP WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/sqlilabs_writeup.html"><strong aria-hidden="true">20.36.</strong> sqlilabs WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/pwnable_kr_challenge.html"><strong aria-hidden="true">20.37.</strong> Solutions for pwnable.kr</a></li><li class="chapter-item "><a href="../../posts/ctf/the_periodic_table.html"><strong aria-hidden="true">20.38.</strong> The Periodic Table</a></li><li class="chapter-item "><a href="../../posts/ctf/pwntools_cheatsheet.html"><strong aria-hidden="true">20.39.</strong> Pwntools Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/gdb_cheatsheet.html"><strong aria-hidden="true">20.40.</strong> GDB Cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/iltes/iltes.html"><strong aria-hidden="true">21.</strong> ILTES</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/iltes/iltes_writing.html"><strong aria-hidden="true">21.1.</strong> ILTES Writing</a></li></ol></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <!-- Track and set sidebar scroll position -->
        <script>
            var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
            sidebarScrollbox.addEventListener('click', function(e) {
                if (e.target.tagName === 'A') {
                    sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
                }
            }, { passive: true });
            var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
            sessionStorage.removeItem('sidebar-scroll');
            if (sidebarScrollTop) {
                // preserve sidebar scroll position when navigating via links within sidebar
                sidebarScrollbox.scrollTop = sidebarScrollTop;
            } else {
                // scroll sidebar to current active section when navigating via "next/previous chapter" buttons
                var activeSection = document.querySelector('#sidebar .active');
                if (activeSection) {
                    activeSection.scrollIntoView({ block: 'center' });
                }
            }
        </script>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky">
                    <div class="left-buttons">
                        <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </button>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                    </div>

                    <h1 class="menu-title">Andrew&#x27;s Blog</h1>

                    <div class="right-buttons">
                        <a href="https://gitee.com/dnrops/dnrops" title="Git repository" aria-label="Git repository">
                            <i id="git-repository-button" class="fa fa-github"></i>
                        </a>

                    </div>
                </div>

                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script>
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1 id="rust-learn-notebook"><a class="header" href="#rust-learn-notebook">Rust learn notebook</a></h1>
<h2 id="trait-in-rust"><a class="header" href="#trait-in-rust">trait in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>struct Person{
    name:String,
    age:i128
}

trait VoiceBox {
    // speak
    fn speak(&amp;self);
    // can speak
    fn can_speak(&amp;self) -&gt;bool;
}

impl VoiceBox for Person{
    fn speak(&amp;self) {
        println!(&quot;I am {}&quot;,self.name);
    }
    fn can_speak(&amp;self) -&gt;bool {
        if self.age&gt;0{
            return true;
        }else{
            return false;
        }
    }
}

pub fn run(){
    let this_person = Person{name:String::from(&quot;Alen&quot;),age:24};

    println!(&quot;{}can speak?{}&quot;,this_person.name,this_person.can_speak());
    this_person.speak();
}
<span class="boring">}</span></code></pre></pre>
<h2 id="btreemap-类似于-python-的-mapjs-的-set-val-不能重复"><a class="header" href="#btreemap-类似于-python-的-mapjs-的-set-val-不能重复">BTreeMap (类似于 python 的 map，js 的 Set) ，val 不能重复</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(unused_variables)]
use std::collections::BTreeMap;

pub fn run() {
    let mut each_value = String::new();
    std::io::stdin().read_line(&amp;mut each_value).unwrap();

    let mut bmap = BTreeMap::new();
    bmap.insert(&quot;A&quot;, 1);
    bmap.insert(&quot;B&quot;, 2);
    bmap.insert(&quot;C&quot;, 3);
    bmap.insert(&quot;D&quot;, 4);
    bmap.insert(&quot;E&quot;, 5);
    println!(&quot;{:?}&quot;, bmap);
    // remove key-value
    bmap.remove(&quot;C&quot;);
    println!(&quot;{:?}&quot;, bmap);

    // check for a specific one.
    if !bmap.contains_key(&quot;C&quot;) {
        //有的话return true 没有的话false
        println!(&quot;{:?}&quot;, &quot;C not font&quot;);
    }

    let mut data_vector = vec![&quot;A&quot;, &quot;B&quot;, &quot;D&quot;];
    let str_value: &amp;str = &amp;each_value;
    data_vector.push(str_value);
    println!(&quot;{:?}&quot;, data_vector);
    let mut out = BTreeMap::new();
    for i in data_vector.iter() {
        if bmap.get(i) != None {
            let get_val = bmap.get(i);
            out.insert(get_val, get_val);
            println!(&quot;{:?}&quot;, get_val.to_owned());
        }
    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="types-in-rust"><a class="header" href="#types-in-rust">Types in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn run() {
    // 默认情况下rust不需要声明
    let x = 3; //默认i32

    let y = 2.5; //默认f64

    //添加声明
    let k: i64 = 4515165161;

    // i8最大小值
    println!(&quot;MIN i8 {}&quot;, std::i8::MIN);
    println!(&quot;MAX i8 {}&quot;, std::i8::MAX);
    // i32最大小值
    println!(&quot;MIN i32 {}&quot;, std::i32::MIN);
    println!(&quot;MAX i32 {}&quot;, std::i32::MAX);

    // i64最大小值
    println!(&quot;MIN i64 {}&quot;, std::i64::MIN);
    println!(&quot;MAX i64 {}&quot;, std::i64::MAX);
    // i128最大小值
    println!(&quot;MIN i128 {}&quot;, std::i128::MIN);
    println!(&quot;MAX i128 {}&quot;, std::i128::MAX);

    // isize （有符合）
    let var_isize: isize = 9223372036854775807;
    println!(&quot;{}&quot;, var_isize);

    // usize (无符号)
    let var_usize: usize = 1515;
    println!(&quot;{}&quot;, var_usize);

    //布尔类型
    let name = true;
    //声明布尔类型
    let is_big: bool = 10 &gt; 5;
    let face = '\u{1f151}';

    let a = 'a'; //char

    println!(&quot;{:?}&quot;, (x, y, k, name, is_big, a, face));

    // 无符号数
    let data: u8 = 150;
    println!(&quot;{:?}&quot;, data);
    let data: u16 = 150;
    println!(&quot;{:?}&quot;, data);
    let data: u32 = 150;
    println!(&quot;{:?}&quot;, data);
    let data: u64 = 150;
    println!(&quot;{:?}&quot;, data);
    let data: u128 = 150;
    println!(&quot;{:?}&quot;, data);

    // 浮点数
    let float_num: f32 = 2.;
    println!(&quot;{}&quot;, float_num);
    let float_num: f64 = 0.22222222;
    println!(&quot;{}&quot;, float_num);

    // char 字符
    let chars: char = 'A'; //need to  be '' ,not can be &quot;&quot;
    let cn_name: char = '艾';
    println!(&quot;{},{}&quot;, chars, cn_name);

    // change type in rust
    // int to float or u64,u32..
    // as
    let int_data: i32 = 2020;
    let float_data = int_data as f32;
    let u64_data: u64 = int_data as u64;
    println!(&quot;int to float:{}&quot;, float_data + 0.5);
    println!(&quot;int to u64:{}&quot;, u64_data);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="vector-in-rust"><a class="header" href="#vector-in-rust">Vector in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>//vector是向量
pub fn run() {
    let mut n: Vec&lt;i32&gt; = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; //[元素属性；向量的元素个数]

    //改某一个元素值
    n[9] = 10;

    //添加元素
    n.push(23); //最后面添加元素
    n.push(15);
    //删除最后一个元素
    let popeditem = n.pop();
    // 输出删除的元素
    println!(&quot;poped itemis :{}&quot;, popeditem.unwrap());
    println!(&quot;{:#?}&quot;, n); //竖直输出
    println!(&quot;{:?}&quot;, n); //横向输出
                         //单一输出
    println!(&quot;frist value:{:?}&quot;, n[0]); //输出第一个元素
    println!(&quot;last value:{:?}&quot;, n[n.len() - 1]); //输出最后一个元素

    //向量长度
    println!(&quot;向量长度：{}&quot;, n.len());
    //向量所占空间
    println!(&quot;occupies {} byte&quot;, std::mem::size_of_val(&amp;n)); //每一个元素占4byte

    //向量切片
    let s = &amp;n[0..5]; //从第0到第4个元素
    println!(&quot;{:?}&quot;, s);

    //向量的遍历
    for x in n.iter() {
        println!(&quot;{}&quot;, x);
    }
    //向量遍历时改值
    for x in n.iter_mut() {
        *x *= 3; //每一个元素乘2
    }
    println!(&quot;{:?}&quot;, n);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="vecdeque-双向链表"><a class="header" href="#vecdeque-双向链表">VecDeque （双向链表）</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>use std::{collections::VecDeque};

pub fn run(){
    let mut buff = VecDeque::new();
    // add to front buffer
    buff.push_front(1);
    buff.push_front(4);
    // add to end buffer
    buff.push_back(10);
    buff.push_back(40);
    println!(&quot;{:?}&quot;, buff);

    // Swaps elements at indices i and j.
    buff.swap(0, 2);
    println!(&quot;{:?}&quot;,buff);

    //get capacity 占的空间
    let len = buff.capacity();
    println!(&quot;{}&quot;,len);

    //get length
    let length = buff.len();
    println!(&quot;{}&quot;,length);

    buff.reserve_exact(len);
    println!(&quot;{:?}&quot;,buff);

    //to Vec
    let c: Vec&lt;&amp;i32&gt; = buff.iter().collect();
    println!(&quot;vec: {:?}&quot;,c);

    //lop value
     for num in buff.iter() {
    let val = *num;
    println!(&quot;{}&quot;,val);
    }

    //loop value and change
    for num in buff.iter_mut() {
    *num = *num - 2;   }

    println!(&quot;{:?}&quot;,buff);


}
<span class="boring">}</span></code></pre></pre>
<h2 id="enum-in-rust"><a class="header" href="#enum-in-rust">enum in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(dead_code)]
enum Alphabet{
    A,
    B,
    C,
    D,
    E,
    Z,
    W
}
impl Alphabet {
    fn is_end_leter(&amp;self) -&gt;bool{
        match self {
        &amp;Alphabet::Z =&gt;return true,
        _ =&gt;return false
        }
    }
}
pub fn run(){
    let d = Alphabet::Z;

    println!(&quot;{:?}&quot;,d.is_end_leter());

}



//another example

enum Colors {
    Red = 0xff0000,
    Black = 0x000fff,

}


struct Bank{
    pub cardnumber: String,
    pub amount: f32,

}


enum Payments {
    Cash(f32),
    CirditCard(String,f32),
    BankCard(Bank),
    OnlineCard{user:String,amount:f32},
}

pub fn run(){
    // use color enum
    println!(&quot;{:06x}&quot;,Colors::Red as i32);
    println!(&quot;{:06x}&quot;,Colors::Black as i32);

    //use Payments enum
    let cashpay = Payments::Cash(3000000.5);
    process_payment(cashpay);

    let cc_pay = Payments::CirditCard(&quot;jiaotong&quot;.to_owned(),1000000.66);
    process_payment(cc_pay);
    let bank_pay = Payments::BankCard(Bank{cardnumber:&quot;622000111222111&quot;.to_owned(),amount:23000.});
    process_payment(bank_pay);

    let online = Payments::OnlineCard{user:&quot;Alen&quot;.to_owned(),amount:600000.};
    process_payment(online);
}

fn process_payment(pay:Payments){
    match pay{
        Payments::Cash(amt)=&gt; {println!(&quot;It is{}&quot;,amt);}
        Payments::CirditCard(_,amt)=&gt; {println!(&quot;It is{}&quot;,amt);}
        Payments::BankCard(data)=&gt; {println!(&quot;It is{} {}&quot;,data.cardnumber,data.amount);}
        Payments::OnlineCard{user,amount}=&gt; {println!(&quot;It is{} {}&quot;,user,amount);}

    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="sum-up-ascii_code"><a class="header" href="#sum-up-ascii_code">sum up ascii_code</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>fn sum_up_ascii_code(b: String) -&gt; f64 {
       let mut sum: u32 = 0;
       for i in b.chars() {
           sum += i as u32
       }
       return (sum as i32) as f64;
   }
   let result_1 = sum_up_ascii_code(&quot;AB&quot;.to_string());
   println!(&quot;{}&quot;, result_1);
<span class="boring">}</span></code></pre></pre>
<h2 id="cell-in-rust"><a class="header" href="#cell-in-rust">Cell in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(unused_variables)]
use std::cell::Cell;
/**
 * Cell 原生值可以改
*/
#[allow(dead_code)]
struct Book {
    name: String,
    price: Cell&lt;u32&gt;,
}
pub fn run() {
    let rust_book = Book {
        name: &quot;rust-book&quot;.into(),
        price: Cell::new(99),
    };
    assert_eq!(rust_book.name, &quot;rust-book&quot;);
    assert_eq!(rust_book.price.get(), 99);
    rust_book.price.set(199); //Cell 原生值可以改
    assert_eq!(rust_book.price.get(), 199);

    let s: String = &quot;rust-book&quot;.into();
    let bar = Cell::new(s);
    bar.set(&quot;15&quot;.into()); //可以改值
    let x = bar.into_inner(); //Get String value from Cell
    println!(&quot;{}&quot;, x);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="refcell-in-rust"><a class="header" href="#refcell-in-rust">RefCell in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(unused_variables)]
use std::cell::RefCell;
/**
 * RefCell 原生值可以改
*/
#[allow(dead_code)]
struct Book {
    name: String,
    price: RefCell&lt;u32&gt;,
}
pub fn run() {
    let mut rust_book = Book {
        name: &quot;rust-book&quot;.into(),
        price: RefCell::new(99),
    };
    assert_eq!(rust_book.name, &quot;rust-book&quot;);
    rust_book.price.borrow_mut(); //RefCell 原生值可以改
    println!(&quot;{:?}&quot;, rust_book.price.borrow()); //99
    println!(&quot;{:?}&quot;, rust_book.price.as_ptr()); //指针地址 0x7ffcb13f2c40
    println!(&quot;{:?}&quot;, *rust_book.price.get_mut() + 10); //99+10 =&gt;109

    let s: String = &quot;rust-book&quot;.into();
    let bar = RefCell::new(s);
    bar.borrow_mut().push_str(&quot; 15&quot;); //可以改值 为rust-book 15
    let x = bar.into_inner(); //Get String value from refCell
    println!(&quot;{}&quot;, x);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="generic-in-rust"><a class="header" href="#generic-in-rust">generic in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(dead_code)]
// structF32 Point{
//     x:i32,
//     y:i32,
// }
// structF64 Point{
//     x:i32,
//     y:i32,
// }  //为了 通用不同的type 可以用以下的操作

//struct can be generic
struct Point&lt;T, U&gt; {
    x: T,
    y: U, //要是x y 的type不一样 &lt;T,U&gt;
}
// enum canbe generic
enum Selection&lt;T&gt; {
    // OptionA(T),
    OptionB(T),
    // OptionC,
}
//function can be generic
// std::ops::Add is a trait
// fn dog&lt;T:std::ops::Add&lt;Output=T&gt; + std::ops::Sub&lt;Output=T&gt; + std::fmt::Debug&gt;(dog_age:T,father_age:T,child_age:E) -&gt; T{
//    println!(&quot;{:?}&quot;,father_age);
//    let sub = dog_age-father_age;
// //    let add = dog_age+father_age;
//    sub
// } //这样写代码太长 下面做一些改善
fn dog&lt;T, E&gt;(dog_age: T, father_age: T, child_age: E) -&gt; T
where
    T: std::ops::Add&lt;Output = T&gt; + std::ops::Sub&lt;Output = T&gt; + std::fmt::Debug,
    E: std::fmt::Debug,
{
    println!(&quot;{:?}&quot;, father_age);
    println!(&quot;{:?}&quot;, child_age);
    dog_age + father_age
}

// create owen trait
// add str to string
trait AddStr {
    fn add(&amp;self, a: &amp;str, b: &amp;str) -&gt; String;
}
#[allow(non_snake_case)]
#[allow(dead_code)]
// use trait
fn add_str_to_String&lt;T&gt;(var: &amp;T) -&gt; String
where
    T: AddStr + std::fmt::Debug,
{
    println!(&quot;{:?}&quot;, var);
    var.add(&quot;Alen&quot;, &quot;Andry&quot;)
}

// sttuct can be generic
struct Person&lt;T, U&gt;
where
    T: std::fmt::Debug,
    U: std::fmt::Debug,
{
    name_t: T,
    age_u: U,
}

impl&lt;T, U&gt; Person&lt;T, U&gt;
where
    T: std::fmt::Debug,
    U: std::fmt::Debug,
{
    fn log(&amp;self) {
        println!(&quot;{:?} {:?}&quot;, self.name_t, self.age_u);
    }
}

pub fn run() {
    // generic struct
    let a = Point {
        x: 10_f32,
        y: 30_i32,
    }; //f32
    println!(&quot;{} {}&quot;, a.x, a.y);
    let a = Point {
        x: 10.10_f32,
        y: 30.6_f64,
    }; //f64
    println!(&quot;{} {}&quot;, a.x, a.y);

    // generic enum

    let s = Selection::OptionB(&quot;sting&quot;);

    match s {
        // Selection::OptionA(e)=&gt; println!(&quot;{}&quot;,e),
        Selection::OptionB(f) =&gt; println!(&quot;{}&quot;, f),
        // Selection::OptionC =&gt; println!(&quot;option c&quot;),
    }

    // generic function
    let f = dog(10, 20, 5);
    println!(&quot;{:?}&quot;, f);

    // add_str_to_String

    // use  struct generic
    let alen = Person {
        name_t: &quot;23&quot;,
        age_u: &quot;11&quot;,
    };
    alen.log();
}
<span class="boring">}</span></code></pre></pre>
<h2 id="linkedlist-链表"><a class="header" href="#linkedlist-链表">LinkedList (链表)</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>use std::collections::LinkedList;

// 链表
pub fn run() {
    let mut list = LinkedList::new();
    list.push_front(&quot;1&quot;);
    list.push_front(&quot;2&quot;);
    list.push_front(&quot;3&quot;);
    list.push_back(&quot;10&quot;);
    list.push_back(&quot;20&quot;);
    list.push_back(&quot;30&quot;);
    println!(&quot;{:?}&quot;, list);

    // change list item type Sting ti int
    let mut str_to_int = LinkedList::new();
    for item in list.iter() {
        str_to_int.push_back(item.parse::&lt;i32&gt;().unwrap());
    }
    println!(&quot;to int:{:?}&quot;, str_to_int);

    let mut new_list = LinkedList::new();
    new_list.push_front(1);
    new_list.push_front(2);
    new_list.push_front(3);
    new_list.push_back(10);
    new_list.push_back(20);
    new_list.push_back(30);
    println!(&quot;{:?}&quot;, new_list);

    //change new_list type int to String
    let mut int_to_string = LinkedList::new();
    for item in new_list.iter() {
        int_to_string.push_back(item.to_string());
    }

    println!(&quot;to str:{:?}&quot;, int_to_string);

    // append Moves all elements from list2 to the end of the list.
    // list.append(list2)  list2 become empty

    // convert a &amp;str to a String is to_owned
    // list 中的元素是&amp;str int_to_string 是String 所以会出错
    let mut list_sting = LinkedList::new();
    for item in list.iter_mut() {
        let new_item: String = item.to_owned(); //&amp;str converto string
        list_sting.push_back(new_item);
    }
    list_sting.append(&amp;mut int_to_string); //int_to_string to the end of list_sting
    println!(&quot;{:?}&quot;, list_sting);

    // pub fn back(&amp;self) -&gt; Option&lt;&amp;T&gt;
    // assert_eq!(list_sting.back(),Some(&amp;Sting::from(&quot;30&quot;)));
}
<span class="boring">}</span></code></pre></pre>
<h2 id="module-in-rust"><a class="header" href="#module-in-rust">module in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>// 可以直接定义mod
mod printer{
    pub fn print(data:String){
        println!(&quot;{}&quot;,data);
    }
    // 也可以在mod 里面定义mod
    pub mod show{
        pub fn show_age(age:&amp;str){
            println!(&quot;age :{}&quot;,age);
        }
    }
}


pub fn run(){

    printer::print(&quot;Alen&quot;.to_string());
    printer::show::show_age(&quot;24&quot;);

}
<span class="boring">}</span></code></pre></pre>
<h2 id="options-in-rust"><a class="header" href="#options-in-rust">options in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn run() {
    println!(
        &quot;job is {}&quot;,
        match get_job(&quot;Alen&quot;) {
            Some(j) =&gt; j,
            None =&gt; &quot;no find&quot;,
        }
    );
}
fn get_job(name: &amp;str) -&gt; Option&lt;&amp;str&gt; {
    match name {
        &quot;Alen&quot; =&gt; Some(&quot;Software developer&quot;),
        &quot;Andry&quot; =&gt; Some(&quot;Web Disigner&quot;),
        _ =&gt; None,
    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="parse-json-in-rust"><a class="header" href="#parse-json-in-rust">parse json in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>extern crate serde;
extern crate serde_json;
// #[macro_use]
// extern crate serde_derive;
#[allow(unused_imports)]
use serde_json::Value as jsonvalue;

// #[derive(Serialize,Deserialize)]
#[allow(dead_code)]
// struct Person {
//     name: String,
//     age: u32,
//     is_male: bool,
//     language: String,
// }

pub fn run() {
    let json_string = r#&quot;
        {
            &quot;name&quot;:&quot;Alen Andry&quot;,
            &quot;age&quot;:&quot;24&quot;,
            &quot;is_male&quot;:true,
            &quot;language&quot;:&quot;English&quot;
        }
        &quot;#;
    let res = serde_json::from_str(json_string);
    if res.is_ok() {
        let p: jsonvalue = res.unwrap();
        println!(&quot;name = {:?}&quot;, &amp;p[&quot;name&quot;].as_str().unwrap());
        println!(&quot;age = {:?}&quot;, &amp;p[&quot;age&quot;].as_str().unwrap());
        println!(&quot;is_male = {:?}&quot;, &amp;p[&quot;is_male&quot;]);
        println!(&quot;language = {:?}&quot;, &amp;p[&quot;language&quot;]);
    } else {
        println!(&quot;not get json&quot;);
    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="generate-random-number-in-rust"><a class="header" href="#generate-random-number-in-rust">generate random number in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>extern crate rand;
use rand::Rng;
pub fn run() {
    {
        //range random num
        let random_num = rand::thread_rng().gen_range(10, 25); //1-24
        println!(&quot;{}&quot;, random_num);
    }
    {
        //randim boolean value
        let bool = rand::thread_rng().gen_weighted_bool(2); //概率0.5 为true
        let bool1 = rand::thread_rng().gen_weighted_bool(5); //概率1/5=0.2 为true
        println!(&quot;random boolean {} {}&quot;, bool, bool1);
    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="read-file-in-rust"><a class="header" href="#read-file-in-rust">read file in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>use std::fs::File;
use std::io::prelude::*;
#[allow(unused_imports)]
use std::io::{BufRead, BufReader, Error, Write};
#[allow(dead_code)]
pub fn run() {
    {
        //read toml file
        let mut toml_file = File::open(&quot;toml_file.toml&quot;).expect(&quot;Can't open&quot;);
        let mut content = String::new();
        toml_file
            .read_to_string(&amp;mut content)
            .expect(&quot;Can't to string&quot;);

        println!(&quot;toml file content:{}&quot;, content);
    }

    {
        //read txt file
        let mut txt_file =
            File::open(&quot;/home/alen/code/rust_code/rust_grammar/txt_file.txt&quot;).expect(&quot;Can't open&quot;);
        let mut content = String::new();
        txt_file
            .read_to_string(&amp;mut content)
            .expect(&quot;Can't to string&quot;);

        println!(&quot;txt file content:{}&quot;, content);
    }


}
<span class="boring">}</span></code></pre></pre>
<h2 id="write-file-in-rust"><a class="header" href="#write-file-in-rust">write file in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>use std::fs::File;
use std::io::prelude::*;

pub fn run() {
    {
        //write toml
        let mut toml_file = File::create(&quot;output.toml&quot;).expect(&quot;can't create file&quot;);
        toml_file
            .write_all(b&quot;[output]\ndata = \&quot;output.toml\&quot;&quot;)
            .expect(&quot;can't write&quot;);
    }
    {
        //write txt
        let mut txt_file = File::create(&quot;output.txt&quot;).expect(&quot;can't create file&quot;);
        txt_file
            .write_all(b&quot;txt file\ndata = \&quot;output.txt\&quot;&quot;)
            .expect(&quot;can't write&quot;);
    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="regex-in-rust"><a class="header" href="#regex-in-rust">regex in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>extern crate regex;
use regex::Regex;
<span class="boring">}</span></code></pre></pre>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn run() {

    {//captures
    let re = Regex::new(r&quot;(?x)(?P&lt;year&gt;\d{4})-(?P&lt;month&gt;\d{2})-(?P&lt;day&gt;\d{2})&quot;).unwrap();
    let caps = re.captures(&quot;2010-03-1400&quot;).unwrap();

    dbg!(&amp;caps[0]);
    dbg!(&amp;caps[&quot;year&quot;]);
    }

     {//captures_iter 可遍历
        let re = Regex::new(r&quot;(?x)(?P&lt;year&gt;\d{4})-(?P&lt;month&gt;\d{2})-(?P&lt;day&gt;\d{2})&quot;).unwrap();
        let caps = re.captures_iter(&quot;2010-03-1400&quot;);

        for  i in caps {
            dbg!(&amp;i);
        }
    }

    {
      let re = Regex::new(r&quot;(\d{5})&quot;).unwrap(); //match 5个数
      let txt = &quot;12345&quot;;
      println!(&quot;{}&quot;, re.is_match(txt));
      match re.captures(txt) {
          Some(val) =&gt; println!(&quot;{}&quot;, &amp;val[0]),
          None =&gt; println!(&quot;none&quot;),
          }
	  }

     {//str to vec! split str to Vec
        let re = Regex::new(r&quot;[ \t]+&quot;).unwrap();
        let fields: Vec&lt;&amp;str&gt; = re.split(&quot;a b \t  c\td    e&quot;).collect();
        dbg!(&amp;fields);
        assert_eq!(fields, vec![&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;]);

    }

     {//is match 返回 true flase
       let text = &quot;I categorically deny having&quot;;
       dbg!(Regex::new(r&quot;\b\w{4}\b&quot;).unwrap().is_match(text)); //regex 匹配四个字母 存在的话返回true
        assert!(Regex::new(r&quot;\b\w{4}\b&quot;).unwrap().is_match(text));
    }

    {//find
        let text = &quot;I alen categorically deny having triskaidekaphobia.&quot;;
        let mat = Regex::new(r&quot;\b\w{4}\b&quot;).unwrap().find(text).unwrap(); //从左开始匹配 返回满足条件的开始 结束index
        dbg!(mat);

    }

      {//NoExpand
        use regex::NoExpand;

        let re = Regex::new(r&quot;(?P&lt;last&gt;[^,\s]+),\s+(\S+)&quot;).unwrap();
        let result = re.replace(&quot;^Springsteen, Bruce&quot;, NoExpand(&quot;$2 $last&quot;));
        dbg!(result);
    }

    {//返回first match 的位置
        let text = &quot;aaaaa&quot;;
        let pos = Regex::new(r&quot;a+&quot;).unwrap().shortest_match(text);
        dbg!(pos.unwrap());
    }





}
<span class="boring">}</span></code></pre></pre>
<h2 id="字符串反转-reverse-string"><a class="header" href="#字符串反转-reverse-string">字符串反转 reverse string</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>  fn reverse(phrase:&amp;str)-&gt; String {
        let mut i = phrase.len();
        let mut reversed = String::new();
        while i &gt; 0 {
            reversed.push(phrase.chars().nth(i - 1).unwrap());
            i -= 1;
        }
        reversed

    }
<span class="boring">}</span></code></pre></pre>
<h2 id="等待执行-函数"><a class="header" href="#等待执行-函数">等待执行 函数</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>use std::thread;
use std::time::{Duration, Instant};

fn expensive_function() {
    //一秒后执行的函数
    thread::sleep(Duration::from_secs(1));
}

pub fn run() {
    let start = Instant::now(); //开始计时
    expensive_function();
    expensive_function();
    expensive_function();
    expensive_function();
    expensive_function();
    let duration = start.elapsed(); //停止计时

    println!(&quot;Time elapsed in expensive_function() is: {:?}&quot;, duration); //run expensive_function() 经历的时间
}
<span class="boring">}</span></code></pre></pre>
<h2 id="string-in-rust"><a class="header" href="#string-in-rust">String in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(unused_variables)]

pub fn run() {
    // str 不可变
    let str: &amp;str = &quot;Hello&quot;;
    println!(&quot;{}&quot;, str);
    // string 可变
    let string = String::from(&quot;Hello world&quot;);
    println!(&quot;{}&quot;, string);

    // convert &amp;srt to String    &amp;str转化为string
    let some_str: &amp;str = &quot;data&quot;;
    let sring_from_str = some_str.to_owned();
    assert_eq!(sring_from_str, String::from(&quot;data&quot;));

    {
        // string to &amp;str
        let name = String::from(&quot;Alen Andry&quot;);
        let name_str: &amp;str = name.as_str();
        println!(&quot;&amp;str:{}&quot;, name_str);
    }

    let i = 5;
    let five = String::from(&quot;5&quot;);
    assert_eq!(five, i.to_string());

    let mut name = String::from(&quot;Alen &quot;);
    //添加char
    name.push('A');
    //添加string
    name.push_str(&quot;ndry&quot;);
    //长度
    let length = name.len();
    //所占字节
    let capacity = name.capacity();
    // 字符串是否空
    let is_empty = name.is_empty();
    //是否包含子串
    let contains = name.contains(&quot;Andry&quot;);
    //交换子串
    let change = name.replace(&quot;Andry&quot;, &quot;Dnrops&quot;); // Andry-&gt;Dnrops
    println!(&quot;name:{:?}\nlength:{:?}&quot;, (name), (length));
    println!(&quot;capacity:{:?}\nis_empy:{:?}&quot;, (capacity), (is_empty));
    println!(&quot;Is Andry contains  name:{:?}&quot;, (contains));
    println!(&quot;{}&quot;, change);

    //遍历string (按空格)
    for word in name.split_whitespace() {
        println!(&quot;{}&quot;, word);
    }
    // 按字节新建string
    let mut s = String::with_capacity(10); //新建大小为10字节的string
    s.push('a'); //在string里添加元素
    s.push('B');
    println!(&quot;{}&quot;, s);

    //断言测试 (测试左右值是否相等)
    //assert_eq!(1,2);
    //只有不相等时提示错误
    assert_eq!(2, s.len());
    assert_eq!(10, s.capacity());

    // push
    let mut some_string = String::new();
    some_string.push('a');
    some_string.push('a');
    some_string.push('a');
    some_string.push('a');
    // push_str
    some_string.push_str(&quot;\tmy name is alen&quot;);

    println!(&quot;{}&quot;, some_string);

    //combine two string
    let new_some_string = String::from(&quot; mali&quot;);
    let mut_string = String::from(&quot; Andry&quot;);
    let my_mali: String = String::from(&quot;I LOVE MICHELLE&quot;);
    let combined_string = some_string + &amp;new_some_string + &amp;mut_string + &amp;my_mali;
    println!(&quot;{}&quot;, combined_string);

    // substring
    let sub_string = &amp;combined_string[..5]; //0-4
    let sub_string1 = &amp;combined_string[16..]; //16-end
    let sub_string2 = &amp;combined_string[16..20]; //16-20
    println!(&quot;{}\n{}\n{}&quot;, sub_string, sub_string1, sub_string2);

    // get char by index
    let mali: String = String::from(&quot;I LOVE MICHELLE&quot;);
    let get_char_index2 = &amp;mali.chars().nth(2).unwrap();
    println!(&quot;{}&quot;, get_char_index2);

    // for 遍历 String
    for item in 0..mali.len() {
        println!(&quot;{}&quot;, &amp;mali.chars().nth(item).unwrap());
    }

    // match Sting
    let get_char_index3 = &amp;mali.chars().nth(5);
    match get_char_index3 {
        Some(i) =&gt; println!(&quot;It is {}&quot;, i),
        None =&gt; {}
    }
    // if let  跟 match 一样
    if let Some(i) = &amp;mali.chars().nth(5) {
        println!(&quot;It is {}&quot;, i);
    }
    //删除俩端的空格
    {
        let name = &quot;  Alen  &quot;.to_string();
        println!(&quot;before :{}&quot;, name);
        let after = name.trim();
        println!(&quot;after:{}&quot;, after);
    }

    {
        //转化为大写
        let mut s = String::from(&quot;foobar&quot;);
        let s_mut_str = s.as_mut_str();

        s_mut_str.make_ascii_uppercase();

        println!(&quot;uppercase :{}&quot;, s_mut_str);
    }

    {
        //转化为ascii码
        let s = String::from(&quot;hello&quot;);
        let s_ascii_str: &amp;[u8] = s.as_bytes();
        println!(&quot;ascii:{:?}&quot;, s_ascii_str);
    }

    {
        //string 反转化

        let mut s = String::from(&quot;hello&quot;);
        unsafe {
            let vec = s.as_mut_vec();
            assert_eq!(&amp;[104, 101, 108, 108, 111][..], &amp;vec[..]);

            vec.reverse();
        }
        assert_eq!(s, &quot;olleh&quot;);
        println!(&quot;reversed:{}&quot;, s);
    }

    {
        //清空string
        let mut s = String::from(&quot;foo&quot;);

        s.clear();
        assert!(s.is_empty());
        assert_eq!(0, s.len());
        assert_eq!(3, s.capacity());
    }
}
<span class="boring">}</span></code></pre></pre>
<h2 id="struct-结构体"><a class="header" href="#struct-结构体">struct 结构体</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>//结构体(name field struct)
// struct name 第一个字母必须得大写
struct Book {
    name: String,
    athur: String,
}

//tuple struct  (元组结构体)
struct Cellphone(&amp;'static str, String, u64);

//单元结构体
struct Empty;

//结构体创建函数
struct Person {
    f_name: String,
    l_name: String,
}

//结构体创建函数
impl Person {
    //
    fn new_str(m: &amp;str, n: &amp;str) -&gt; Person {
        // return Person{name:f_name,lname:l_name};
        Person {
            f_name: m.to_string(),
            l_name: n.to_string(),
        }
    }

    //full name  // 使用在impl里面
    fn full_name(&amp;self) -&gt; String {
        format!(&quot;{}  {}&quot;, self.f_name, self.l_name)
    }

    //set last name
    fn set_last_name(&amp;mut self, last: &amp;str) {
        self.l_name = last.to_string();
    }
    //name to tuple(转化为元组)
    fn to_tuple(self) -&gt; (String, String) {
        (self.f_name, self.l_name)
    }
}

// define some struct
struct FrameworkAndCompany {
    msn: String,
    pytorch: String,
    tensorflow: String,
}

pub fn run() {
    //调用(name field struct)
    let mut c = Book {
        name: &quot;RUST&quot;.to_string(),
        athur: String::from(&quot;Alen&quot;),
    };
    c.athur = String::from(&quot;Andry&quot;);
    println!(&quot;{}  {}&quot;, c.name, c.athur);

    //调用(tuple struct)
    let mut phone = Cellphone(&quot;redmi&quot;, String::from(&quot;alen&quot;), 2019);

    phone.1 = String::from(&quot;Alen&quot;);
    println!(&quot;marka is {}  owener: {} year:{}&quot;, phone.0, phone.1, phone.2);

    //调用单元结构体
    let x = Empty;
    println!(&quot;{:p}&quot;, &amp;x); //输出X的内存地址

    //调用结构体创建函数
    let mut p = Person::new_str(&quot;marry&quot;, &quot;tusun&quot;);
    println!(&quot;{}  {}&quot;, p.f_name, p.l_name);
    println!(&quot;full name: {}&quot;, p.full_name());
    p.set_last_name(&quot;abduginy&quot;);
    println!(&quot;full name: {}&quot;, p.full_name());
    println!(&quot;full name to tuple: {:?}&quot;, p.to_tuple());

    // use framework struct
    let mut frames = FrameworkAndCompany {
        tensorflow: &quot;google&quot;.to_owned(),
        msn: &quot;MSN&quot;.to_owned(),
        pytorch: &quot;facebook&quot;.to_owned(),
    };
    //change name
    frames.tensorflow = String::from(&quot;GOOGLE&quot;);

    println!(&quot; {:?}&quot;, frames.tensorflow);
    println!(&quot; {:?}&quot;, frames.msn);
    println!(&quot; {:?}&quot;, frames.pytorch);

    let frames2 = FrameworkAndCompany {
        msn: String::from(&quot;Dark Commany&quot;),
        ..frames // 来填充剩下的 struct element
    };
    println!(&quot;{:?}&quot;, frames2.pytorch);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="test-code-in-rust"><a class="header" href="#test-code-in-rust">Test code in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>//结构体(name field struct)
// struct name 第一个字母必须得大写
struct Book {
    name: String,
    athur: String,
}

//tuple struct  (元组结构体)
struct Cellphone(&amp;'static str, String, u64);

//单元结构体
struct Empty;

//结构体创建函数
struct Person {
    f_name: String,
    l_name: String,
}

//结构体创建函数
impl Person {
    //
    fn new_str(m: &amp;str, n: &amp;str) -&gt; Person {
        // return Person{name:f_name,lname:l_name};
        Person {
            f_name: m.to_string(),
            l_name: n.to_string(),
        }
    }

    //full name  // 使用在impl里面
    fn full_name(&amp;self) -&gt; String {
        format!(&quot;{}  {}&quot;, self.f_name, self.l_name)
    }

    //set last name
    fn set_last_name(&amp;mut self, last: &amp;str) {
        self.l_name = last.to_string();
    }
    //name to tuple(转化为元组)
    fn to_tuple(self) -&gt; (String, String) {
        (self.f_name, self.l_name)
    }
}

// define some struct
struct FrameworkAndCompany {
    msn: String,
    pytorch: String,
    tensorflow: String,
}

pub fn run() {
    //调用(name field struct)
    let mut c = Book {
        name: &quot;RUST&quot;.to_string(),
        athur: String::from(&quot;Alen&quot;),
    };
    c.athur = String::from(&quot;Andry&quot;);
    println!(&quot;{}  {}&quot;, c.name, c.athur);

    //调用(tuple struct)
    let mut phone = Cellphone(&quot;redmi&quot;, String::from(&quot;alen&quot;), 2019);

    phone.1 = String::from(&quot;Alen&quot;);
    println!(&quot;marka is {}  owener: {} year:{}&quot;, phone.0, phone.1, phone.2);

    //调用单元结构体
    let x = Empty;
    println!(&quot;{:p}&quot;, &amp;x); //输出X的内存地址

    //调用结构体创建函数
    let mut p = Person::new_str(&quot;marry&quot;, &quot;tusun&quot;);
    println!(&quot;{}  {}&quot;, p.f_name, p.l_name);
    println!(&quot;full name: {}&quot;, p.full_name());
    p.set_last_name(&quot;abduginy&quot;);
    println!(&quot;full name: {}&quot;, p.full_name());
    println!(&quot;full name to tuple: {:?}&quot;, p.to_tuple());

    // use framework struct
    let mut frames = FrameworkAndCompany {
        tensorflow: &quot;google&quot;.to_owned(),
        msn: &quot;MSN&quot;.to_owned(),
        pytorch: &quot;facebook&quot;.to_owned(),
    };
    //change name
    frames.tensorflow = String::from(&quot;GOOGLE&quot;);

    println!(&quot; {:?}&quot;, frames.tensorflow);
    println!(&quot; {:?}&quot;, frames.msn);
    println!(&quot; {:?}&quot;, frames.pytorch);

    let frames2 = FrameworkAndCompany {
        msn: String::from(&quot;Dark Commany&quot;),
        ..frames // 来填充剩下的 struct element
    };
    println!(&quot;{:?}&quot;, frames2.pytorch);
}
<span class="boring">}</span></code></pre></pre>
<h2 id="数组中找到最小的"><a class="header" href="#数组中找到最小的">数组中找到最小的</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn find_smallest_int(arr: &amp;[i32]) -&gt; i32 {
    let mut arr_vec = arr.to_vec();  //to_vec 是 arr转化为 vec
    arr_vec.sort();
    println!(&quot;{}&quot;, arr_vec[0]);
    arr_vec[0]
}
<span class="boring">}</span></code></pre></pre>
<h2 id="fib-in-rust"><a class="header" href="#fib-in-rust">fib in rust</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub fn run() {
    //produce fib
    fn product_fib(prod: u64) {
        // your code
        let mut p: i64 = prod as i64;
        fn fib(n: u64) -&gt; u64 {
            match n {
                0 =&gt; 1,
                1 =&gt; 1,
                _ =&gt; fib(n - 1) + fib(n - 2),
            }
        }
        let mut list: Vec&lt;u64&gt; = Vec::new();
        while p &gt; -1 {
            list.push(fib(p as u64));
            p -= 1;
        }
        println!(&quot;{:?}&quot;, list);
    }
    product_fib(8); //produce 8 number
}
<span class="boring">}</span></code></pre></pre>
<h2 id="rust-数组中删除重复的部分"><a class="header" href="#rust-数组中删除重复的部分">rust 数组中删除重复的部分</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>#[allow(dead_code)]
#[allow(unused_variables)]
#[allow(unused_mut)]

pub fn run() {
    fn unique_in_order&lt;T&gt;(sequence: T) -&gt; Vec&lt;T::Item&gt;
    where
        T: std::iter::IntoIterator,
        T::Item: std::cmp::PartialEq + std::fmt::Debug,
    {
        let mut v: Vec&lt;_&gt; = sequence.into_iter().collect();
        v.dedup();
        v
    }
    let data = vec![&quot;A&quot;, &quot;A&quot;, &quot;B&quot;, &quot;b&quot;, &quot;b&quot;, &quot;b&quot;];
    let data2 = &quot;AAAABBBCCDAABBB&quot;.chars();
    println!(&quot;{:?}&quot;, unique_in_order(data));   //[&quot;A&quot;, &quot;B&quot;, &quot;b&quot;]
    println!(&quot;{:?}&quot;, unique_in_order(data2));  //['A', 'B', 'C', 'D', 'A', 'B']
}
<span class="boring">}</span></code></pre></pre>
<h2 id="enumerate-遍历"><a class="header" href="#enumerate-遍历">enumerate (遍历)</a></h2>
<pre><pre class="playground"><code class="language-rust">pub mod c {
    pub fn run() {
        use proconio::{input, marker::*};
        input! {
            mut s: Chars,
        }
        let s = s
            .iter_mut()
            .map(|x| x.to_string().parse::&lt;i32&gt;().unwrap())
            .collect::&lt;Vec&lt;_&gt;&gt;();
        // println!(&quot;{:?}&quot;, s);
        let mut items = Vec::new();
        let mut indexs = Vec::new();
        for (index, item) in s.iter().enumerate() {
            items.push(item.to_string());
            indexs.push(index.to_string());
            // println!(
            //     &quot;{} {}&quot;,
            //     s.len() as i32 - index.to_owned() as i32,
            //     item.to_owned()
            // );
        }
        //if s = 145
        println!(&quot;{:?}&quot;, indexs); //[&quot;0&quot;, &quot;1&quot;, &quot;2&quot;]
        println!(&quot;{:?}&quot;, items); //[&quot;1&quot;, &quot;4&quot;, &quot;5&quot;]
    }
}

fn main() {
    c::run();
}</code></pre></pre>
<h2 id="quick-start-iter-fold"><a class="header" href="#quick-start-iter-fold">quick start iter fold()</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>let a = [1, 2, 3];
// the sum of all of the elements of the array
let sum = a.iter().fold((0,0), |init, x|
{
    let n = init.0+*x;
    let m = init.1+*x;
    (n,m)
}
);
eprintln!(&quot;{:?}&quot;,sum);
<span class="boring">}</span></code></pre></pre>
<h2 id="select-mul-atcoder_abc_221_c"><a class="header" href="#select-mul-atcoder_abc_221_c">Select Mul (Atcoder_abc_221_C)</a></h2>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>Sample Input 1
123
Sample Output 1
63
As described in Problem Statement, there are six ways to separate it:
12 and 3,
21 and 3,
13 and 2,
31 and 2,
23 and 1,
32 and 1.
The products of these pairs, in this order, are 36, 63, 26, 62, 23, 32, with 63 being the maximum.
<span class="boring">}</span></code></pre></pre>
<pre><pre class="playground"><code class="language-rust">//solution for problem C
/*
input: 123
out: 63
{&quot;1&quot;: &quot;23&quot;, &quot;12&quot;: &quot;3&quot;, &quot;3&quot;: &quot;21&quot;, &quot;31&quot;: &quot;2&quot;, &quot;32&quot;: &quot;1&quot;}
[23, 32, 36, 62, 63] -&gt;out max value
*/

pub mod c {
    pub fn run() {
        use proconio::{input, marker::*};
        use std::collections::BTreeMap;
        input! {
            mut s: Chars,
        }
        //reverse
        fn reverse(phrase: String) -&gt; String {
            let mut i = phrase.len();
            let mut reversed = String::new();

            while i &gt; 0 {
                reversed.push(phrase.chars().nth(i - 1).unwrap());
                i -= 1;
            }
            reversed
        }
        let s = s.iter_mut().map(|x| x.to_string()).collect::&lt;Vec&lt;_&gt;&gt;();
        //generate bmap
        fn generate_bmap(s: Vec&lt;String&gt;) {
            let s_string = s.join(&quot;&quot;).to_string();
            let mut bmap: BTreeMap&lt;String, String&gt; = BTreeMap::new();
            for i in 1..s_string.len() {
                let mut s_string = s.clone().join(&quot;&quot;).to_string();
                let s_string_l = s_string.split_off(i);
                bmap.insert(s_string, s_string_l);
            }
            for i in 1..s_string.len() {
                let mut s_string = reverse(s.clone().join(&quot;&quot;).to_string());
                let s_string_l = s_string.split_off(i);
                bmap.insert(s_string, s_string_l);
            }
            let mut first_last_string = s.clone()[s.len() - 1].to_string();
            first_last_string.push_str(&amp;s.clone()[0].to_owned());

            let mut middle_string = String::new();
            for i in 1..s.len() - 1 {
                middle_string.push_str(&amp;s.clone()[i]);
            }
            bmap.insert(first_last_string, middle_string);

            let mut vec = vec![];
            for (v, k) in &amp;bmap {
                vec.push(
                    v.to_owned().parse::&lt;i128&gt;().unwrap() * k.to_owned().parse::&lt;i128&gt;().unwrap(),
                );
            }
            vec.sort();
            println!(&quot;{:?}&quot;, vec[vec.len() - 1]);
            // println!(&quot;{:?}&quot;, bmap);
            // println!(&quot;{:?}&quot;, vec);
        }

        generate_bmap(s.clone());
    }
}

fn main() {
    c::run();
}</code></pre></pre>
<h2 id="online-games-atcoder_abc_221_d"><a class="header" href="#online-games-atcoder_abc_221_d">Online games (Atcoder_abc_221_D)</a></h2>
<pre><pre class="playground"><code class="language-rust">//solution for problem D
// 3
// 1 2
// 2 3
// 3 1
mod d {
    pub fn run() {
        proconio::input! {
            n: usize,
            ab: [(u32, u32); n],
        }
        let mut m = std::collections::BTreeMap::new();
        for (a, b) in ab {
            *m.entry(a).or_insert(0) += 1;
            *m.entry(a + b).or_insert(0) -= 1;
        }
        let mut d = vec![0; n + 1];
        let mut p = 0;
        let mut k = 0;
        for (i, j) in m {
            d[k as usize] += i - p;
            p = i;
            k += j;
        }
        d.remove(0);
        println!(
            &quot;{:?}&quot;,
            d.iter_mut()
                .map(|x| x.to_string())
                .collect::&lt;Vec&lt;_&gt;&gt;()
                .join(&quot; &quot;)
        );
    }
}
fn main() {
    d::run();
}</code></pre></pre>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                            <a rel="prev" href="../../posts/rust/offline_use_rust.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                                <i class="fa fa-angle-left"></i>
                            </a>

                            <a rel="next" href="../../posts/rust/pase_string_and_decimal_conversion.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                <i class="fa fa-angle-right"></i>
                            </a>

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                    <a rel="prev" href="../../posts/rust/offline_use_rust.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                        <i class="fa fa-angle-left"></i>
                    </a>

                    <a rel="next" href="../../posts/rust/pase_string_and_decimal_conversion.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                        <i class="fa fa-angle-right"></i>
                    </a>
            </nav>

        </div>



        <script>
            window.playground_line_numbers = true;
        </script>

        <script>
            window.playground_copyable = true;
        </script>

        <script src="../../ace.js"></script>
        <script src="../../editor.js"></script>
        <script src="../../mode-rust.js"></script>
        <script src="../../theme-dawn.js"></script>
        <script src="../../theme-tomorrow_night.js"></script>

        <script src="../../elasticlunr.min.js"></script>
        <script src="../../mark.min.js"></script>
        <script src="../../searcher.js"></script>

        <script src="../../clipboard.min.js"></script>
        <script src="../../highlight.js"></script>
        <script src="../../book.js"></script>

        <!-- Custom JS scripts -->
        <script src="../../src/js/custom.js"></script>


    </div>
    </body>
</html>
